package com.ssm.demo.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Transient;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;

/**
 * 
 * @ClassName: BaseModel
 * @Description: 基础类
 * @author Yin Qingsheng
 * @date 2018年12月18日 上午11:18:12
 *
 */
@MappedSuperclass // MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中
public abstract class BaseModel implements Serializable, Comparable<BaseModel> {

	private static final long serialVersionUID = 5431000660533035173L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@JsonProperty(value = "id")
	private Integer id;

	/**
	 * @JsonIgnore 在json序列化时将java bean中的一些属性忽略掉，序列化和反序列化都受影响。
	 */
	private Date createTime;
	/**
	 * @JsonIgnore
	 */
	private Date editTime;
	/**
	 * @JsonProperty 此注解用于属性上，作用是把该属性的名称序列化为另外一个名称，如把trueName属性序列化为name，@JsonProperty("name")。
	 */
	@JsonProperty(value = "createUser")
	private String createUser;

	/**
	 * @JsonProperty
	 */
	@JsonProperty(value = "editUser")
	private String editUser;

	/**
	 * @Transient的作用是指定该属性或字段不是永久的。 它用于注释实体类，映射超类或可嵌入类的属性或字段。
	 */
	@Transient
	public String errorMsg;

	@JsonIgnore
	public Integer getId() {
		return id;
	}

	@JsonIgnore
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @PrePersist 帮助您在持久化之前自动填充实体属性。 可以用来在使用jpa的时记录一些业务无关的字段，比如最后更新时间等等。
	 *             save之前被调用，它可以返回一个DBObject代替一个空的
	 */
	@PrePersist
	protected void onCreate() {
		if (createTime == null)
			this.createTime = new Date();
		if (editTime == null)
			this.editTime = new Date();
	}

	/**
	 * @PreUpdate 用于为相应的生命周期事件指定回调方法。 该注释可以应用于实体类，映射超类或回调监听器类的方法。 用于setter
	 *            如果要每次更新实体时更新实体的属性，可以使用@PreUpdate注释。 使用该注释，您不必在每次更新用户实体时显式更新相应的属性
	 */
	@PreUpdate
	protected void onUpdate() {
		this.editTime = new Date();

		if (this.createTime == null)
			this.createTime = this.editTime;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public Date getEditTime() {
		return editTime;
	}

	public void setEditTime(Date editTime) {
		this.editTime = editTime;
	}

	@JsonIgnore
	public String getCreateUser() {
		return createUser;
	}

	@JsonIgnore
	public void setCreateUser(String createUser) {
		this.createUser = createUser;
	}

	@JsonIgnore
	public String getEditUser() {
		return editUser;
	}

	@JsonIgnore
	public void setEditUser(String editUser) {
		this.editUser = editUser;
	}

	public void setErrorMsg(String errorMsg) {
		this.errorMsg = errorMsg;
	}

	public String getErrorMsg() {
		return errorMsg;
	}

	/**
	 * hashCode重写
	 */
	@Override
	public int hashCode() {
		return id.hashCode();
	}

	/**
	 * equals重写
	 */
	@Override
	public boolean equals(Object object) {

		if (object == null) {
			return false;
		}
		if (this == object && this.hashCode() == object.hashCode()) {
			return true;
		}

		if (!(object instanceof BaseModel)) {
			return false;
		}

		final BaseModel other = (BaseModel) object;
		Serializable thisId = this.getId();
		Serializable otherId = other.getId();
		if ((thisId == null && otherId != null) || (thisId != null && !thisId.equals(otherId))) {
			return false;
		}
		return true;
	}

	/**
	 * 升序比较
	 */
	public int compareTo(BaseModel another) {

		if (this.getId() > another.getId()) {

			return -1;

		} else if (this.getId() < another.getId()) {

			return 1;
		}

		return 0;
	}

	/**
	 * 
	 * @Title: getClassName
	 * @Description: 获取类名
	 * @return String 
	 * @author Yin Qingsheng 
	 * @date 2018年12月18日 上午11:12:54 
	 * @throws
	 */
	public String getClassName() {
		return this.getClass().getSimpleName();
	}

}
